<?php
namespace Zxf5115\Laravel\Kernel\Casts;

use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;


/**
 * @author zhangxiaofei [<1326336909@qq.com>]
 * @dateTime 2025-09-11
 *
 * 自定义时间格式化类型转换类
 *
 * 将数据库存储的时间戳转换为指定格式的日期字符串
 */
class DateTimeCast implements CastsAttributes
{
  /**
   * 日期格式化字符串
   */
  protected string $format;


  /**
   * 构造函数
   *
   * @param string $format 日期格式，默认 'Y-m-d H:i:s'
   */
  public function __construct(string $format = 'Y-m-d H:i:s')
  {
    $this->format = $format;
  }


  /**
   * 从数据库获取值时转换
   *
   * @param  Model  $model 模型实例
   * @param  string $key 属性名
   * @param  mixed  $value 原始值
   * @param  array  $attributes 所有属性
   * @return string|null 格式化后的日期字符串或空
   */
  public function get(Model $model, string $key, mixed $value, array $attributes) : ?string
  {dd($value);
    if(!$this->isValidTimestamp($value))
    {
      return null;
    }

    return Carbon::createFromTimestamp((int)$value)->format($this->format);
  }


  /**
   * 存入数据库时转换
   *
   * @param  Model  $model 模型实例
   * @param  string $key 属性名
   * @param  mixed  $value 输入值
   * @param  array  $attributes 所有属性
   * @return int|null 转换后的时间戳或空
   */
  public function set(Model $model, string $key, mixed $value, array $attributes) : ?int
  {
    if(empty($value))
    {
      return null;
    }

    if($value instanceof Carbon)
    {
      return $value->timestamp;
    }

    if(is_numeric($value))
    {
      return (int)$value;
    }

    if(is_string($value))
    {
      return $this->parseStringToTimestamp($value);
    }

    return null;
  }


  /**
   * 验证是否为有效的时间戳
   */
  protected function isValidTimestamp(mixed $value) : bool
  {
    return !empty($value) && is_numeric($value) && (int)$value > 0;
  }


  /**
   * 将字符串解析为时间戳
   */
  protected function parseStringToTimestamp(string $value) : ?int
  {
    try
    {
      return Carbon::parse($value)->timestamp;
    }
    catch (InvalidFormatException)
    {
      return null;
    }
  }
}
